package main

import (
	"context"
	"dockerstudy.cn/config"
	"dockerstudy.cn/dao"
	"fmt"
	"gopkg.in/ini.v1"
	"net/http"
	"os"
)

/**
用go语言实现官方案例 https://docs.docker.com/compose/gettingstarted/
编写dockerFile
编写docker-compose.yml 部署上线
*/

var (
	cfg = new(config.AppConf)
)

func main() {
	//加载配置文件
	err := ini.MapTo(cfg, "./config/config.ini")
	if err != nil {
		fmt.Printf("Fail to read file: %v", err)
		os.Exit(1)
	}

	////初始化mysql
	//err = dao.InitGormMysql()
	//if err != nil {
	//	panic(err)
	//}
	////defer dao.CloseMysql()
	////关联模型
	//err = dao.Db.AutoMigrate(&user_model.User{})
	//if err != nil {
	//	panic(err)
	//}

	//初始化redis   "localhost:6379"
	if err = dao.InitRedis(cfg.RedisConf.Host + ":" + cfg.RedisConf.Port); err != nil {
		fmt.Printf("init redis err: %v", err)
		return
	}

	fmt.Println("init ok ")
	fmt.Println(cfg)

	http.HandleFunc("/", hello)
	http.HandleFunc("/index/index", index)
	err = http.ListenAndServe("0.0.0.0:8080", nil)
	if err != nil {
		panic(err)
	}
}

func index(res http.ResponseWriter, req *http.Request) {
	str := "<h1>this is index</h1>"
	res.Write([]byte(str))
	fmt.Println("this is index")
	//在浏览器打开 http://127.0.0.1:9501/index/index
}

//对于get请求，参数都是放在url上(query param),请求体是没有数据的
func hello(res http.ResponseWriter, req *http.Request) {
	fmt.Println("this is func hello")
	ctx, cancel := context.WithCancel(context.Background())
	defer cancel()
	//err := dao.RedisDb.Set(ctx, "key", "value", 0).Err()
	//Redis Incr 命令将 key 中储存的数字值增一。
	//如果 key 不存在，那么 key 的值会先被初始化为 0 ，然后再执行 INCR 操作。
	//如果值包含错误的类型，或字符串类型的值不能表示为数字，那么返回一个错误。
	err := dao.RedisDb.Incr(ctx, "hits").Err()
	if err != nil {
		panic(err)
	}
	val, err := dao.RedisDb.Get(ctx, "hits").Result()
	if err != nil {
		fmt.Printf("get hits failed, err:%v\n", err)
		return
	}
	fmt.Println(val)
	str := "<h1>this is hello ! I have been seen  " + val + " times </h1>"
	res.Write([]byte(str))

	//fmt.Println(req.URL)          ///index/hello
	//fmt.Println(req.Method)       //GET
	//fmt.Println(req.URL.Query())  //自动帮我们识别  map[page:[1]]
	//queryParam := req.URL.Query() //map[page:[1]]
	//fmt.Println(queryParam.Get("page"))
	//fmt.Println(ioutil.ReadAll(req.Body)) //[] <nil>
	//fmt.Println("this is hello")
	//

}

//依赖 go get gopkg.in/ini.v1
//go get -u gorm.io/gorm
//go get -u gorm.io/driver/mysql
//go get -u github.com/gin-gonic/gin
//go get -u github.com/go-redis/redis/v8

//现在本地使用gobuild编译文件  sudo env GOOS=linux GOARCH=386 go build main.go
//go env -w GOOS=linux GOARCH=386
//go mod tidy
//go mod download
//go mod vendor
//go build -o mygoweb
//chmod +x mygoweb  上传打包文件，还要给执行权限，不然拷贝到容器中，会抱没有执行权限的错

//使用Dockerfile + docker-compose.yml 部署一个带有config配置文件的go-web[go+redis]项目到服务器
//1.在本地编译go build 需要在liunx上运行的文件，注意使用 go env -w GOOS=linux GOARCH=386
// go build -o mygoweb
//2.把项目文件上传到宿主机的go/src/app/项目目录中，还有编译的mygoweb文件，上传该文件后还需要给权限
//chmod +x mygoweb  上传打包文件，还要给执行权限，不然拷贝到容器中，会抱没有执行权限的错
//3.编写Dockerfile	注意端口号
//4.编写docker-compose.yml  注意端口号必须是安全组开放的端口号
//5.编写完后上传到服务器
//6.运行 docker-compose up /docker-compose --help /docker-compose up --build /docker-compose stop ....
//docker-compose --help
//ok
